package com.chinackts.proceedspayment.exportproceeds.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.chinackts.common.filestorage.StorageModule;
import com.chinackts.common.okhttp.OkHttpRequest;
import com.chinackts.common.utils.SecurityUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author Lianhong
 * @since 2021/11/19
 */
@Service
public class ExportProceedsStoreService {

    //是否启用电子口岸数据仓库
    @Value("${e-port.ware-house.enable}")
    private boolean enable;
    //电子口岸数据仓库
    @Value("${e-port.ware-house.password}")
    private String password;
    //单电子口岸数据仓库
    @Value("${e-port.ware-house.url}")
    private String url;

    @Value("${e-port.file-storage.url}")
    private String fileStorageUrl;

    @Resource
    private OkHttpRequest okHttpRequest;

    /**
     * 根据报关单号判断是否存在
     *
     * @param entryId 报关单号
     */
    public boolean exists(String entryId) {
        if (!enable) return false;
        String exists = okHttpRequest.get(String.format("%s/export-proceeds/%s/exists", url, entryId), null);
        return Boolean.parseBoolean(exists);
    }

    /**
     * 根据报关单号列表获取已存在的报关单号
     *
     * @param rows 报关单号列表
     */
    public List<String> exists(List<JSONObject> rows) {
        if (!enable) return Collections.emptyList();
        List<String> entryIds = rows.stream().map(item -> item.getString("entryId")).collect(Collectors.toList());
        String result = okHttpRequest.post(String.format("%s/export-proceeds/exists", url), JSON.toJSONString(entryIds));
        return StringUtils.isBlank(result) ? Collections.emptyList() : Arrays.asList(result.split(","));
    }

    /**
     * 根据报关单号查询出口收汇明细
     *
     * @param entryId 报关单号
     */
    public JSONObject get(String entryId) {
        if (!enable) return null;
        String result = okHttpRequest.get(String.format("%s/export-proceeds/%s", url, entryId), null);
        return JSON.parseObject(SecurityUtil.decrypt3DES(password, result));
    }

    /**
     * 保存出口收汇明细
     *
     * @param exportProceeds 出口收汇明细
     */
    public void save(JSONObject exportProceeds) {
        if (!enable) return;
        okHttpRequest.post(String.format("%s/export-proceeds", url), SecurityUtil.encrypt3DES(password, exportProceeds.toJSONString()));
    }


    /**
     * 根据 报关单号 判断出口收汇文件是否已存储
     *
     * @param entryId 报关单号
     */
    public boolean stored(String entryId) {
        if (!enable) return false;
        String stored = okHttpRequest.get(String.format("%s/export-proceeds/%s/file/stored", url, entryId), null);
        return Boolean.parseBoolean(stored);
    }

    /**
     * 保存出口收汇文件名
     *
     * @param entryId 报关单号
     */
    public void saveFile(StorageModule module, String entryId, String storedFileName) {
        if (!enable) return;
        String file = fileStorageUrl + module.toString() + "/" + storedFileName;
        okHttpRequest.post(String.format("%s/export-proceeds/%s/file", url, entryId), file);
    }

    /**
     * 根据 报关单号 查询 出口收汇已存储的文件名
     *
     * @param entryId 报关单号
     */
    public String storedFile(String entryId) {
        if (!enable) return null;
        return okHttpRequest.get(String.format("%s/export-proceeds/%s/file", url, entryId), null);
    }
}
